package com.itheima.streamdemo1;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Demo2 {

    public static void main(String[] args) {

        //掌握Stream提供的常用的中间方法，对流上的数据进行处理（会返回新流，支持链式编程）

        List<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("田七");
        list.add("张无忌");
        list.add("李四");
        list.add("张三");
        list.add("张翠山");
        System.out.println(list);

        //1.过滤方法
        list.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(System.out::println);

        //2.排序方法
        List<Double> scores = new ArrayList<>();
        scores.add(77.5);
        scores.add(77.5);
        scores.add(99.5);
        scores.add(55.5);
        scores.add(55.5);
        scores.add(66.5);
        scores.add(88.5);
        scores.stream().sorted().forEach(System.out::println);      //升序
        System.out.println("-----------");
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).forEach(System.out::println);   //降序
        System.out.println("-----------");
        //降序后的前两个
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).limit(2).forEach(System.out::println);
        System.out.println("-----------");
        //降序后去掉前两个
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).skip(2).forEach(System.out::println);
        System.out.println("-----------");
        //去重
        //如果希望对自定义对象进行去重，必须重写对象的hasCode()和equals()方法（Double已经重写）
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).distinct().forEach(System.out::println);
        System.out.println("-----------");

        //3.映射/加工方法：把流上用来的数据加工成新数据后，返回一个新的流
        scores.stream().map(s -> "加10分后：" + (s + 10)).forEach(System.out::println);
        System.out.println("-----------");

        //4.合并两个流
        Stream<String> stream1 = Stream.of("张三丰","田七","张无忌","李四","张三","张翠山");
        Stream<Integer> stream2 = Stream.of(77,88,99,55,66,88);
        Stream<Object> stream3 = Stream.concat(stream1,stream2);
        System.out.println(stream3.count());        //count()和forEach()是终止方法
        //stream3.forEach(System.out::println);     //stream3流已经用完，不能再使用，报错

    }
}
